#ifndef AST_RETURN
#define AST_RETURN
#include <string>
#include "node.h"

namespace AST {

    /**
     * Retorno de Subprograma
     *
     * Estrutura utilizada para apresentação de resultados que finalizam uma
     * chamada de subprograma. Esta estrutura recebe como parâmetro uma
     * expressão resultante para retorno ou caso contrário fornecerá um elemento
     * do tipo vazio.
     *
     * @category AST
     * @package  AST
     */
    class Return : public Node {

    private:

        /**
         * Resultado de Operação
         */
        Node* _result;

        /**
         * Configuração de Resultado
         *
         * Durante a finalização de um subprograma, podemos apresentar um
         * resultado de execução utilizando retorno de valores. Estes retornos
         * são expressões que pode ser descritas.
         *
         * @param  Node*   Resultado para Configuração
         * @return Return* Próprio Objeto para Encadeamento
         */
        Return* _setResult(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método construtor que recebe como parâmetro um nó de árvore abstrata
         * de sintaxe que expõe o resultado que deve ser apresentado para
         * finalização do subprograma.
         *
         * @param Node* Elemento para Resultado
         */
        Return(Node*);

        /**
         * Construtor sem Resultado
         *
         * Utilizado quando um retorno não é informado, sendo adicionado uma
         * expressão com resultado vazio dentro da própria estrutura da classe.
         */
        Return();

        /**
         * Captura de Resultado
         *
         * Apresentação do nó de árvore abstrata de sintaxe que representa o
         * resultado que deve ser apresentado durante a finalização do
         * subprograma a ser executado.
         *
         * @return Node* Elemento Solicitado
         */
        Node* getResult();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

